package object;

public class ObjectDemo {
    public static void main(String[] args) {
        Point p = new Point(100,200);
        //1）String、StringBuilder都重写了toString()来返回具体的字符串内容了
        //2）自己写的类要自己重写toString()
        System.out.println(p);
        System.out.println(p.toString());

        //1）调用Object类的equals()时默认比较的还是==(即比较地址)，没有参考意义，所以常常重
        //   写equals()来比较具体的属性值
        //2）重写equals()的基本原则：
        //1.原则上要比较两个对象的属性值是否相同
        //2.两个对象必须是同一类型的，若类型不同则直接返回false
        Point p1 = new Point(100,200);
        Point p2 = new Point(100,200);
        System.out.println(p1==p2);//false 比较的还是地址 （==是比较地址）想比较p1、p2的属性，要用重写后equals()
        System.out.println(p1.equals(p2));//false 比较的还是地址,重写equals()后比较属性为true

        //String类、包装类重写了equals()来比较内容是否相等，但StringBuilder并没有。
        String s1 = "hello";
        String s2 = "hello";
        System.out.println(s1==s2);//true 2个String字符串都是存储在常量池中,同一个地址
        System.out.println(s1.equals(s2));//true
        String s3 = new String("hello");
        String s4 = new String("hello");
        System.out.println(s3==s4);//false //引用类型用==是比较的是地址，2个new的对象在堆中是不同的地址
        System.out.println(s3.equals(s4));//ture String自带重写equals()，比较的是对象的属性

        StringBuilder builder = new StringBuilder("hello");
        StringBuilder builder1 = new StringBuilder("hello");
        System.out.println(builder==builder1);//false
        System.out.println(builder.equals(builder1));//false

        /*StringBuilder builder = new StringBuilder("hello");
        StringBuilder builder1 = new StringBuilder("hello");
        System.out.println(builder==builder1);//false
        System.out.println(builder.equals(builder1));//false*/



























        /*//调用Object类的equals(),内部还是在使用==比较地址，没有参考意义
        //若想比较对象的属性值是否相同，我们认为Object类的equals()并不能满足需求
        //因此常常需要重写equals
        Point p1 = new Point(100,200);
        Point p2 = new Point(100,200);
        System.out.println(p1==p2);//false比较的是地址
        //
        System.out.println(p1.equals(p2));//false
        String s1 = new String("hello");
        String s2 = new String("hello");
        //String类重写了equals()来比较字符串内容是否相等
        System.out.println(s1.equals(s2));//true
        StringBuilder builder = new StringBuilder("hello");
        StringBuilder builder1 = new StringBuilder("hello");
        //StringBuilder类没有重写equals()，因此调用的还是Object类的equals()比较地址
        System.out.println(builder.equals(s2));//false
        //s1与builder的类型不同，所以equals()一定是false
        System.out.println(s1.equals(builder));//false*/























        /*输出引用变量时默认调用Object类的toString()方法
          该方法返回的字符串格式为：类的全程@hashcode值
          但通常这个返回结果对我们的开发是没有意义的
          我们真正想输出的应该是对象的属性值
          我们认为Object类的toString()来返回

         */
//        Point p = new Point(100,200);
//        System.out.println(p);
//        System.out.println(p.toString());

    }
}
